From 1a1adcfe49f607f2967157b80fe2f626377a0ff4 Mon Sep 17 00:00:00 2001 From: "kaf24@firebug.cl.cam.ac.uk" Date: Thu, 31 Aug 2006 03:05:40 +0100 Subject: [PATCH] [LINUX] /proc/iomem should not be initialised from pseudophysical e820 map. This is because it should only contain real I/O memory address ranges, otherwise we can get false conflicts between a real I/O range and a 'pseudophysical' RAM range, causing drivers to fail to work in a domU. Also prevent kernel code/data being requested as iomem resources -- they are not contiguous in 'io memory' space so this would not make sense. Signed-off-by: Keir Fraser --- linux-2.6-xen-sparse/arch/i386/kernel/setup-xen.c | 7 +++---- linux-2.6-xen-sparse/arch/x86_64/kernel/e820-xen.c | 2 ++ linux-2.6-xen-sparse/arch/x86_64/kernel/setup-xen.c | 5 +++-- 3 files changed, 8 insertions(+), 6 deletions(-) diff --git a/linux-2.6-xen-sparse/arch/i386/kernel/setup-xen.c b/linux-2.6-xen-sparse/arch/i386/kernel/setup-xen.c index 3edae00dce..3457e31c8c 100644 --- a/linux-2.6-xen-sparse/arch/i386/kernel/setup-xen.c +++ b/linux-2.6-xen-sparse/arch/i386/kernel/setup-xen.c @@ -1380,8 +1380,10 @@ legacy_init_iomem_resources(struct e820entry *e820, int nr_map, * so we try it repeatedly and let the resource manager * test it. */ +#ifndef CONFIG_XEN request_resource(res, code_resource); request_resource(res, data_resource); +#endif #ifdef CONFIG_KEXEC request_resource(res, &crashk_res); #endif @@ -1454,11 +1456,8 @@ static void __init register_memory(void) int i; /* Nothing to do if not running in dom0. */ - if (!is_initial_xendomain()) { - legacy_init_iomem_resources(e820.map, e820.nr_map, - &code_resource, &data_resource); + if (!is_initial_xendomain()) return; - } #ifdef CONFIG_XEN machine_e820 = alloc_bootmem_low_pages(PAGE_SIZE); diff --git a/linux-2.6-xen-sparse/arch/x86_64/kernel/e820-xen.c b/linux-2.6-xen-sparse/arch/x86_64/kernel/e820-xen.c index 1dcaedc0d5..333a9a26f4 100644 --- a/linux-2.6-xen-sparse/arch/x86_64/kernel/e820-xen.c +++ b/linux-2.6-xen-sparse/arch/x86_64/kernel/e820-xen.c @@ -255,8 +255,10 @@ void __init e820_reserve_resources(struct e820entry *e820, int nr_map) * so we try it repeatedly and let the resource manager * test it. */ +#ifndef CONFIG_XEN request_resource(res, &code_resource); request_resource(res, &data_resource); +#endif #ifdef CONFIG_KEXEC request_resource(res, &crashk_res); #endif diff --git a/linux-2.6-xen-sparse/arch/x86_64/kernel/setup-xen.c b/linux-2.6-xen-sparse/arch/x86_64/kernel/setup-xen.c index 96da64e242..8fe13ee2b0 100644 --- a/linux-2.6-xen-sparse/arch/x86_64/kernel/setup-xen.c +++ b/linux-2.6-xen-sparse/arch/x86_64/kernel/setup-xen.c @@ -944,9 +944,10 @@ void __init setup_arch(char **cmdline_p) BUG_ON(HYPERVISOR_memory_op(XENMEM_machine_memory_map, &memmap)); e820_reserve_resources(machine_e820, memmap.nr_entries); - } else -#endif + } +#else e820_reserve_resources(e820.map, e820.nr_map); +#endif request_resource(&iomem_resource, &video_ram_resource); -- 2.30.2